﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudentDemoP18_2 {
    internal class Program {
        static void Main(string[] args) {
            Student stu = new Student() { Name = "Tim" };
            //这里打印的是 Tom
            SomeMethod(stu);
            //这里打印的也是 Tim
            //在C#中，引用类型（如类）是按值传递的，但传递的是引用的副本，而不是对象本身
            // 初始时，Main方法中的stu和SomeMethod中的参数stu指向同一个Student对象（"Tim"）。
            //但在SomeMethod中，stu = new Student() { Name = "Tom" };
            //这行代码将参数stu重新指向了一个新的Student对象（"Tom"），
            //而不会影响Main方法中的stu变量。
            Console.WriteLine("{0},{1}", stu.Name, stu.GetHashCode());

            Console.WriteLine("======================");
            //这里打印 zhangsan
            UpdateObject(stu);
            //这里也是zhangsan，因为没有指向新的对象
            Console.WriteLine("{0},{1}", stu.Name, stu.GetHashCode());
            Console.ReadLine();
        }

        static void SomeMethod(Student stu) {
            //这里给stu赋值的新的对象
            stu = new Student() { Name = "Tom" };
            Console.WriteLine("{0},{1}", stu.Name, stu.GetHashCode());
        }

        static void UpdateObject(Student stu) {
            stu.Name = "zhangsan";
            Console.WriteLine("{0},{1}", stu.Name, stu.GetHashCode());
        }
    }

    class Student {
        public String Name { get; set; }
    }
}